import re

# ()：表示分组
print(re.search('a(.*)z', 'asdfhszfsff'))
print(re.search(r'\(.*\)', 'fa(1+1)sda'))  # \( ==> ( 否则就是分组

# .：表示除了换行以外的任意字符
# 如果想要匹配.要使用\.

# []：表示单个元素的可选项，\[or\]表示匹配[or]
print(re.search('stu[0-6]', 'stu2_0001'))
print(re.search(r'\[name\]', 'person1[name] = \'tom\''))
print(re.search(r'[1-3]+', '01132132010302'))
print(re.search('[0-1a-cx]+', 'Begin0010abxxxend'))

# |：表示or
print(re.search(r'a(0|1)b', 'dlkfsa01010010blkfl'))  # None
print(re.search(r'a(0|1)+b', 'dlkfsa01010010blkfl'))

# {}：限定表示前面元素出现的次数
# {n}:表示出现n次
# {n,}:表示出现n次及以上
# {, n}:表示出现n次及以下
# {m, n}: 表示出现[m, n]次
print(re.search('go{2}d', 'tttgodgoodttt'))
print(re.search(r'go{2,}d', 'goooood'))
print(re.search(r'go{,4}d', 'good'))

# *：表示前面的元素出现任意次数

# +：表示前面元素至少出现一次

# ?:两种用法
# 1.等价于{, 1}
# 2.将贪婪模式转化成非贪婪模式

# ^<begin>  <end>$:以指定元素开头、结尾
print(re.search('^a.*b$', 'afflfb'))  # afflfb
print(re.search('^a.*b$', 'aslnflsns b fsf'))  # None
print(re.search('^a.*b$', 'slfs\nalsnfb\njfdsfsf', re.M))  # alsnfb
